package Fachada;


import java.util.Date;
import java.util.List;

import Basicas.Apartamento;
import Basicas.Cliente;
import Basicas.Hospedagem;
import Basicas.Pagamento;
import Basicas.Produto;
import Basicas.SituacaoApartamento;
import Basicas.TipoApartamento;
import Basicas.TipoOcupacao;
import Basicas.Usuario;
import Exception.AlterarException;
import Exception.ApartamentoJaExisteException;
import Exception.ErroLogarException;
import Exception.ErroLoginInativoException;
import Exception.EstoqueBaixoException;
import Exception.GenericoException;
import Exception.InserirException;
import Exception.PernoiteNaoPermitidaException;
import Exception.RelatorioVazioException;
import Exception.RemoverException;
import ModelRelatorio.RelatorioPorHora;
import ModelRelatorio.RelatorioPorMes;


public interface IFachada {
	
	/**
	 * Apartamento
	 * @throws CamposObrigatoriosException 
	 * @throws ApartamentoJaExisteException 
	 * @throws FallhaInserirApartamentoException 
	 */
	
	public void apartamentoInserir(Apartamento ap) throws ApartamentoJaExisteException, InserirException;
	
	public void apartamentoAlterar(Apartamento ap) throws AlterarException, ApartamentoJaExisteException;
	
	public void apartamentoExcluir(Apartamento ap) throws RemoverException ;
	
	public List<Apartamento> apartamentoListarTodos();
	
	public List<Apartamento> apartamentoListarSituacao(SituacaoApartamento sit);
	
	public Apartamento apartamentoFindById(int id);
	
	public List<Apartamento> apartamentoListarTipo(TipoApartamento tipo);
	
	public List<Apartamento> apartamentoPesquisar(List<TipoApartamento> tipos,List<SituacaoApartamento> situacoes  );

	
	/**
	 * Usuario
	 * @throws FalhaInserirUsuarioException 
	 * @throws InserirException 
	 */
	
	
	void usuarioInserir(Usuario u, String senhaconfirmacao)
			throws InserirException, GenericoException;
	
	public void usuarioAlterar(Usuario u) throws AlterarException, GenericoException;
	
	public void usuarioExcluir(Usuario u) throws RemoverException;
	
	public List<Usuario> usuarioListarTodos();
	
	public Usuario usuarioPesquisar(int id);
	
	public Usuario efetuarLogin(String login, String senha) throws ErroLogarException, ErroLoginInativoException;
	
	public void alterarSenhaUsuario(Usuario usuario, String senhaNova, String senhaConfirmacao) throws GenericoException, AlterarException;
	
	
	/**
	 * Cliente
	 */
	
	/**
	 * Utilizado apenas para tentar manter o cadastro de clientes 
	 * Somente o cadastro das placas  
	 * @param c
	 * @throws InserirException 
	 */
	public void clienteInserir(Cliente c) throws InserirException;
	public List<Cliente> clienteListarTodos();
	public void clienteAlterar(Cliente c) throws AlterarException;
	public void clienteExcluir(Cliente c) throws RemoverException;
		
	
	/**
	 * Produto - Movimentar Estoque
	 * @throws InserirException 
	 */
	
	public void produtoIserir(Produto p) throws InserirException;
	
	public void produtoAlterar(Produto p) throws AlterarException;
	
	public void produtoExcluir(Produto p) throws RemoverException;
	
	public List<Produto> produtoListarTodos();
	
	public void verificarEstoque(Produto P)throws EstoqueBaixoException;

	
	/**
	 * Realizar Login
	 */
	
	public Boolean realizarLogin(String login, String senha);
	

	/**
	 * Realizar Hospedagem
	 * @throws InserirException 
	 */
	
	public List<Hospedagem> hospedagemListarTodas();
	
	public void realizarHospedagem(Hospedagem hospedagem,Cliente cliente) throws InserirException;
	
	public void validarHospedagem(TipoOcupacao tipo) throws PernoiteNaoPermitidaException;
	
	public Hospedagem obterHospedagemPorAp(Apartamento ap, SituacaoApartamento sit);
	
	public void cancelarHospedagem(Hospedagem hospedagem);
	
	
	/**
	 * Registrar Consumo (Item de pedido)
	 * @throws InserirException 
	 */
	
	public void registrarConsumo(Integer numeroAP, Produto p, Integer qntConsumida, Double valorConsumido) throws InserirException;
	
	
	
	/**
	 * Fechar Conta
	 * @throws AlterarException 
	 */
	
	public void fecharConta(Hospedagem hosp) throws AlterarException;
	
	
	/**
	 * Registar pagamento (Rever como ser? feito - olhar caso de uso)
	 * @throws InserirException 
	 */
	
	public void registarPagamento(Hospedagem h,Pagamento p) throws InserirException;
	
	
	/**
	 * Refazer Conta (Rever como ser? feito - olhar caso de uso)
	 */
	
	public void refazerConta();
	
	/**
	 * Encerrar Hospedagem
	 */
	
	public void encerarHospedagem(Integer numeroAP);

	public Double fazerConta(Pagamento p);
	
	public void conta(Pagamento p) throws InserirException;
	
	public Double calcularValorAdicional(Date previsto);
	
	public void efetuarPagamento(Pagamento pagamento) throws InserirException;
	
	
	/*
	 * Relatorios 
	 */
	
	public List<RelatorioPorMes> relatorioMovimentacaoPorMes(Integer ano) throws RelatorioVazioException;
	
	public List<RelatorioPorHora> relatorioMovimentacaoPorHora(Date inicio, Date fim) throws RelatorioVazioException;
}
